//package cn.liukuan.jps.redis;
//
//import cn.liukuan.jps.utils.SerializeUtils;
//import org.apache.lucene.store.RAMFile;
//import redis.clients.jedis.Jedis;
//
//import java.io.Serializable;
//import java.util.*;
//import java.util.concurrent.ConcurrentMap;
//
///**
// * Created by liukuan on 16/5/30.
// */
//public class RedisSerializableClient extends Jedis implements Serializable, ConcurrentMap<String, RAMFile> {
//
//    private static final long serialVersionUID = -1l;
//
//    public RedisSerializableClient(String host, Integer port) {
//
//        super(host, port);
//    }
//
//    public Set<String> keySet(){
//        Set<String> keys = keys("*");
//
//        return keys;
//    }
//
//
//    public boolean containsKey(String name) {
//
//        return exists(name);
//    }
//
//    public RAMFile getFile(String key){
//        byte[] bytes = get(key.getBytes());
//        Object obj = SerializeUtils.unserialize(bytes);
//        if(obj instanceof RAMFile) {
//            RAMFile res = (RAMFile) obj;
//            return (RAMFile) obj;
//        }
//        return null;
//    }
//
//    public RAMFile remove(String key){
//        byte[] bytes = get(key.getBytes());
//        Object obj = SerializeUtils.unserialize(bytes);
//        if(obj != null){
//            del(key.getBytes());
//            RAMFile res = (RAMFile) obj;
//            return (RAMFile) obj;
//        }
//        return null;
//    }
//
//    public void put(String key, Object obj){
//
//        set(key.getBytes(), SerializeUtils.serialize(obj));
//
//    }
//
//    public RAMFile putIfAbsent(String key, Object value){
//
//        byte[] bytes = get(key.getBytes());
//        Object obj = SerializeUtils.unserialize(bytes);
//        if(obj != null){
//           RAMFile res =  (RAMFile) obj;
//            return res;
//        } else {
//            set(key.getBytes(), SerializeUtils.serialize(obj));
//            return null;
//        }
//    }
//
//    public void clear(){
//        flushAll();
//    }
//
//
//    public int size() {
//        return keys("*").size();
//    }
//
//    public boolean isEmpty() {
//        return size() == 0;
//    }
//
//    public boolean containsKey(Object key) {
//        return exists((String) key);
//    }
//
//    public boolean containsValue(Object value) {
//        if (value == null) return false;
//        Set<String> keys = keys("*");
//        for (String key : keys) {
//            byte[] bytes = get(key.getBytes());
//            RAMFile file = (RAMFile) SerializeUtils.unserialize(bytes);
//            if (((RAMFile) value).equals(file)) return true;
//        }
//        return false;
//    }
//
//    public RAMFile get(Object key) {
//        byte[] bytes = get(((String) key).getBytes());
//        RAMFile file = (RAMFile) SerializeUtils.unserialize(bytes);
//        return file;
//    }
//
//    public RAMFile put(String key, RAMFile value) {
//        set(key.getBytes(), SerializeUtils.serialize(value));
//        return value;
//    }
//
//    public RAMFile remove(Object key) {
//        byte[] bytes = get(((String) key).getBytes());
//        RAMFile file = (RAMFile) SerializeUtils.unserialize(bytes);
//        del(((String) key).getBytes());
//        return file;
//    }
//
//    public void putAll(Map<? extends String, ? extends RAMFile> m) {
//
//        for (String s : m.keySet()) {
//            set(s.getBytes(), SerializeUtils.serialize(m.get(s)));
//        }
//
//    }
//
//
//    public Collection<RAMFile> values() {
//        List<RAMFile> result = new ArrayList<RAMFile>();
//        Set<String> keys = keys("*");
//        for (String key : keys) {
//            byte[] bytes = get(key.getBytes());
//            RAMFile file = (RAMFile) SerializeUtils.unserialize(bytes);
//            result.add(file);
//        }
//        return result;
//    }
//
//    public Set<Map.Entry<String, RAMFile>> entrySet() {
//        Set<Map.Entry<String, RAMFile>> result = new HashSet<Map.Entry<String, RAMFile>>();
//        Set<String> keys = keys("*");
//        Entry<String, RAMFile> nextEntry = null;
//        for (String key : keys) {
//            final String eKey = key;
//            byte[] bytes = get(key.getBytes());
//            final RAMFile file = (RAMFile) SerializeUtils.unserialize(bytes);
//
//
//            Entry<String, RAMFile> entry = new Entry<String, RAMFile>(key.hashCode(), key, file, nextEntry);
//
//
//            nextEntry = entry;
//            result.add(entry);
//        }
//        return result;
//    }
//
//    public RAMFile putIfAbsent(String key, RAMFile value) {
//        byte[] bytes = get(key.getBytes());
//        if(bytes == null){
//            set(key.getBytes(), SerializeUtils.serialize(value));
//        }
//        return value;
//    }
//
//    public boolean remove(Object key, Object value) {
//        Long del = del(((String) key).getBytes());
//        if(del > 0) return true;
//        return false;
//    }
//
//    public boolean replace(String key, RAMFile oldValue, RAMFile newValue) {
//        if(containsKey(key)){
//            set(key.getBytes(), SerializeUtils.serialize(newValue));
//            return true;
//        }
//        return false;
//    }
//
//    public RAMFile replace(String key, RAMFile value) {
//        if(containsKey(key)){
//            set(key.getBytes(), SerializeUtils.serialize(value));
//        }
//        return null;
//    }
//
//    private static class Entry<String, RAMFile> implements Map.Entry {
//
//        final int hash;
//        final String key;
//        RAMFile value;
//        Entry next;
//
//        public Entry(int hash, String key, RAMFile value, Entry next) {
//            this.hash = hash;
//            this.key = key;
//            this.value = value;
//            this.next = next;
//        }
//
//        public String getKey() {
//            return key;
//        }
//
//        public RAMFile getValue() {
//            return value;
//        }
//
//        public Object setValue(Object value) {
//            return this.value = (RAMFile) value;
//        }
//
//    };
//}
